跳到主要内容

PyTorch 的优化器

优化器是什么?

优化器是用于调整神经网络参数以最小化或最大化某个目标函数(通常是损失函数)的工具。换句话说,优化器决定了如何根据损失函数的梯度来更新网络中的权重和偏置。

在深度学习中,最常用的优化算法是基于梯度下降的。梯度下降的核心思想是:通过计算损失函数相对于每个参数的梯度(即导数),我们可以知道参数应该如何调整以减少损失。

具体来说,参数的更新公式为:

θnew=θoldη×θJ(θ)\theta_{\text{new}} = \theta_{\text{old}} - \eta \times \nabla_\theta J(\theta)

其中: -θ\theta 代表模型参数(例如权重和偏置)。 -η\eta 是学习率,一个正数,决定了参数更新的步长。 -θJ(θ)\nabla_\theta J(\theta) 是损失函数JJ相对于参数θ\theta的梯度。

常用的优化器:

  1. SGD (随机梯度下降)

    • 每次只使用一个训练样本来计算梯度并更新参数。
  2. Momentum

    • 结合了当前梯度和前一次的梯度来更新参数。这可以防止优化过程中的震荡,并加速收敛。
  3. Adagrad

    • 调整学习率,为每个参数分配一个与其历史梯度成正比的学习率。
  4. RMSprop

    • 与Adagrad类似,但采用移动平均来调整学习率。
  5. Adam

    • 结合了Momentum和RMSprop的思想。
  6. Adadelta, Nadam, FTRL ... 等等。

选择适当的优化器和学习率对于神经网络的训练速度和性能至关重要。不同的优化器有不同的超参数,通常需要根据特定的任务和数据进行调整。

PyTorch 怎么使用优化器

在 PyTorch 中,使用优化器主要可以分为以下几个步骤:

  1. 导入所需的优化器

    import torch.optim as optim
  2. 定义你的模型

    例如,你可以使用 PyTorch 的 nn.Module 来定义一个简单的线性模型:

    import torch.nn as nn

    class SimpleModel(nn.Module):
    def __init__(self, input_dim, output_dim):
    super(SimpleModel, self).__init__()
    self.linear = nn.Linear(input_dim, output_dim)

    def forward(self, x):
    return self.linear(x)
  3. 实例化模型和优化器

    假设你想使用 SGD 优化器:

    model = SimpleModel(input_dim=10, output_dim=1)
    optimizer = optim.SGD(model.parameters(), lr=0.01)

    这里,model.parameters() 返回模型的所有参数(即权重和偏置)。lr 是学习率。

  4. 训练循环中使用优化器

    在训练循环中,你需要:

    • 清除之前的梯度。
    • 进行前向传播以获取输出。
    • 计算损失。
    • 进行反向传播以计算梯度。
    • 使用优化器更新参数。
    # 假设有一些训练数据
    data, labels = ... # 你的训练数据和标签

    # 定义损失函数,例如均方误差损失
    criterion = nn.MSELoss()

    for epoch in range(num_epochs):
    # 清除梯度
    optimizer.zero_grad()

    # 前向传播
    outputs = model(data)

    # 计算损失
    loss = criterion(outputs, labels)

    # 反向传播
    loss.backward()

    # 使用优化器更新参数
    optimizer.step()
  5. 选择其他的优化器

    如果你想使用其他的优化器,比如 Adam,只需修改优化器的实例化步骤即可:

    optimizer = optim.Adam(model.parameters(), lr=0.001)

以上就是在 PyTorch 中使用优化器的基本步骤。当然,还有其他的优化器和相关的超参数可供选择,你可以根据自己的任务和数据来决定使用哪种优化器及其超参数设置。

反向传播是什么?

反向传播(Backpropagation)是训练神经网络时使用的一种算法,用于计算损失函数相对于模型参数的梯度。这些梯度随后被用于更新模型的参数,从而最小化损失函数。反向传播是深度学习中最基础的技术之一,并是许多优化算法(如梯度下降)的核心组成部分。

下面是一个形象的描述:

  1. 前向传播:首先,输入数据经过模型,生成一个预测输出。该预测输出与真实值进行比较,从而得到一个损失值。

  2. 反向传播:然后,从输出层开始,计算每一层对损失的贡献,并根据这些贡献计算损失函数相对于模型参数的梯度。这一过程是通过链式法则实现的,并从输出层反向到输入层。

  3. 参数更新:一旦得到所有参数的梯度,我们就可以使用优化算法(如梯度下降)更新这些参数,目标是减少损失函数的值。

下面用一个简单的比喻来帮助理解:

想象你在一个山谷中,目的是尽快找到到达山谷最低点的路径。这里的“高度”可以看作是损失,你想要最小化这个“高度”。在每一步中,你都检查四周的坡度来决定下一步的方向,这个“坡度”就像是梯度,告诉你哪个方向可以更快地下山。

  • 前向传播就像是看看你当前的位置(高度)。
  • 反向传播就像是查看四周的坡度来决定最陡峭的方向。
  • 参数更新就像是你朝着这个方向走了一步。

在神经网络训练中,我们重复这个过程,直到我们找到一个满意的“低点”(即损失的最小值)或满足其他停止条件。

在PyTorch中,反向传播非常简单,只需要调用损失对象的.backward()方法。这将自动为所有在前向传播中涉及的参数计算梯度。